package com.example.triangle;
import android.opengl.GLES20;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

public class Triangle {

    // 顶点着色器代码，用于控制顶点的位置
    private final String vertexShaderCode =
            "attribute vec4 vPosition;" +
                    "void main() {" +
                    "  gl_Position = vPosition;" +
                    "}";

    // 片段着色器代码，用于控制三角形的颜色
    private final String fragmentShaderCode =
            "precision mediump float;" +
                    "uniform vec4 uColor;"+
                    "void main() {" +
                    "  gl_FragColor = uColor;" +
                    "}";

    private final FloatBuffer vertexBuffer;
    private final int mProgram;
    private int positionHandle;
    private int colorHandle;
    private float[] color; // 存储颜色值的数组
    // 三角形的顶点坐标
    static final int COORDS_PER_VERTEX = 3;
    static float triangleCoords[] = {
            0.0f,  0.622008459f, 0.0f,   // 顶点1（顶部）
            -0.5f, -0.311004243f, 0.0f,   // 顶点2（底部左侧）
            0.5f, -0.311004243f, 0.0f    // 顶点3（底部右侧）
    };

    private final int vertexCount = triangleCoords.length / COORDS_PER_VERTEX;
    private final int vertexStride = COORDS_PER_VERTEX * 4; // 每个顶点的字节数

    // 构造函数
    public Triangle() {
        color = new float[] { 1.0f, 0.0f, 0.0f, 1.0f }; // 初始颜色为红色
        // 初始化顶点字节缓冲区
        ByteBuffer bb = ByteBuffer.allocateDirect(triangleCoords.length * 4);
        bb.order(ByteOrder.nativeOrder());
        vertexBuffer = bb.asFloatBuffer();
        vertexBuffer.put(triangleCoords);
        vertexBuffer.position(0);

        // 加载顶点着色器和片段着色器
        int vertexShader = MyGLRenderer.loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
        int fragmentShader = MyGLRenderer.loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);

        // 创建 OpenGL ES 程序
        mProgram = GLES20.glCreateProgram();
        GLES20.glAttachShader(mProgram, vertexShader);
        GLES20.glAttachShader(mProgram, fragmentShader);
        GLES20.glLinkProgram(mProgram);
    }

    // 绘制三角形
    public void draw() {
        // 将程序添加到 OpenGL ES 环境中
        GLES20.glUseProgram(mProgram);

        // 获取顶点着色器的 vPosition 属性句柄
        positionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");

        // 启用三角形顶点的句柄
        GLES20.glEnableVertexAttribArray(positionHandle);
        // 准备三角形坐标数据
        GLES20.glVertexAttribPointer(positionHandle, COORDS_PER_VERTEX,
                GLES20.GL_FLOAT, false,
                vertexStride, vertexBuffer);
        // 获取片段着色器中 uniform 变量的位置
        colorHandle = GLES20.glGetUniformLocation(mProgram, "uColor");

        // 将颜色值传递给片段着色器中的 uniform 变量
        GLES20.glUniform4fv(colorHandle, 1, color, 0);

        GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount);
        // 禁用顶点数组
        GLES20.glDisableVertexAttribArray(positionHandle);
    }
}
